package ar.edu.utn.frba.disenio.model;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import ar.edu.utn.frba.disenio.fechas.Fecha;
import ar.edu.utn.frba.disenio.fechas.Formato;
import ar.edu.utn.frba.disenio.model.exceptions.CodigoAsientoInvalidoException;

import com.oceanic.AerolineaOceanic;
import com.oceanic.AsientoDTO;

public class Oceanic extends Aerolinea {

	private AerolineaOceanic oceanic;
	
	public Oceanic(AerolineaOceanic interfaz){
		this.oceanic = interfaz;
	}
	/* Principales */
	
	@Override
	public void comprar(Asiento unAsiento, Usuario unUsuario) {
		this.getInterfaz().comprarSiHayDisponibilidad(unUsuario.getDni(), unAsiento.getCodigoDeVuelo(), unAsiento.getNumeroDeAsiento());
	}

	@Override
	public void reservar(Asiento unAsiento, Usuario unUsuario) {
		String dni = unUsuario.getDni();
		String codigoDeVuelo = unAsiento.getCodigoDeVuelo();
		int numeroDeAsiento = unAsiento.getNumeroDeAsiento();
		if (!this.getInterfaz().reservar(dni, codigoDeVuelo, numeroDeAsiento)){
			throw new CodigoAsientoInvalidoException();
		}
	}
	
	@Override
	protected List<VueloDirecto> obtenerVuelos(Busqueda unaBusqueda) {
		List<Asiento> asientosFormateados = new ArrayList<Asiento>();
		List<VueloDirecto> vuelos = new ArrayList<VueloDirecto>();
		String codOrigenOceanic = unaBusqueda.getOrigen().getCodigoOceanic();
		String codDestinoOceanic = null;
		if (unaBusqueda.getDestino() != null){
			codDestinoOceanic = unaBusqueda.getDestino().getCodigoOceanic();
		}
		String fechaDeSalida = this.parsearFecha(unaBusqueda.getFechaSalida());
		List<AsientoDTO> asientosDTODisponibles = this.obtenerAsientosDTO(codOrigenOceanic, codDestinoOceanic, fechaDeSalida);
		
		for (AsientoDTO unAsientoDTO : asientosDTODisponibles){
			int codigoAsiento = unAsientoDTO.getNumeroDeAsiento();
			BigDecimal precioBase = unAsientoDTO.getPrecio();
			Categoria categoria = this.parsearCategoria(unAsientoDTO.getClase());
			Ubicacion ubicacion = this.parsearUbicacion(unAsientoDTO.getUbicacion());
			
			String codigoVuelo = unAsientoDTO.getCodigoDeVuelo();
			Fecha fechaSalida = this.parsearFechayHoraAerolinea(unAsientoDTO.getFechaDeSalida(),unAsientoDTO.getHoraDeSalida());
			Fecha fechaLlegada = this.parsearFechayHoraAerolinea(unAsientoDTO.getFechaDeLlegada(),unAsientoDTO.getHoraDeLlegada());
			Lugar origen = unaBusqueda.getOrigen();
			Lugar destino = new Lugar("", unAsientoDTO.getDestino());

			Asiento asiento = new Asiento(codigoVuelo, codigoAsiento, categoria, ubicacion, precioBase, this);
			VueloDirecto vuelo = new VueloDirecto(codigoVuelo, fechaSalida, fechaLlegada, origen, destino, this);
			
			vuelos = this.agregarVueloAListaSiNoExiste(vuelos, vuelo);
			
			asientosFormateados.add(asiento);
		}
		
		vuelos = this.asociarAsientosAVuelos(asientosFormateados, vuelos);

		return vuelos;
	}
	
	/* Auxiliares */
	
	protected List<AsientoDTO> obtenerAsientosDTO(String origen, String destino, String fechaDeSalida){
		if (destino == null){
			return this.getInterfaz().asientosDisponiblesParaOrigen(origen, fechaDeSalida);
		} else {
			return this.getInterfaz().asientosDisponiblesParaOrigenYDestino(origen, destino, fechaDeSalida);
		}
	}
	
	@Override
	protected BigDecimal porcentajeAdicional() {
		return new BigDecimal(0);
	}
	
	@Override
	protected Ubicacion parsearUbicacion(String unaUbicacion) {
		if (unaUbicacion.equals("Ventana")) {
			return new Ventana();
		} else if (unaUbicacion.equals("Pasillo")) {
			return new Pasillo();
		} else if (unaUbicacion.equals("Centro")) {
			return new Centro();
		}
		return null;
	}

	@Override
	protected Categoria parsearCategoria(String unaCategoria) {
		if (unaCategoria.equals("Primera")) {
			return new Primera();
		} else if (unaCategoria.equals("Ejecutiva")) {
			return new Ejecutiva();
		} else if (unaCategoria.equals("Turista")) {
			return new Turista();
		}
		return null;
	}
	
	public Formato getFormatoFechaAsiento() {
		return  new Formato("dd/MM/yyyy");
	}
	
	private AerolineaOceanic getInterfaz() {
		return oceanic;
	}
	
}
